#include "54func.h"
#include "serverFunc.h"
#include "assistFuncServer.h"
#include "log.h"

#define SALT_LEN 20

static int getSalt(const char* userName, char* salt) {
    if (userName == NULL || salt == NULL) {
        return -1; // 错误：无效的参数
    }

    // 初始化随机数发生器
    srand((unsigned int)time(NULL) + strlen(userName)); // 使用用户名长度作为随机种子的一部分

    const char *chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    int charsLen = strlen(chars);
    int userNameLen = strlen(userName);

    // 将"$6$"写入盐值的开头
    strcpy(salt, "$6$");

    // 生成随机字符填充盐值，留出位置给"$"结尾
    for (int i = 3; i < SALT_LEN; i++) { // 从索引3开始，留出3个位置给"$6$"，最后一个字符留给"$"
        int randIndex = (rand() + userNameLen) % charsLen; // 生成一个随机索引
        salt[i] = chars[randIndex];
    }

    // 将盐值以"$"结尾
    salt[SALT_LEN - 1] = '$';
    salt[SALT_LEN] = '\0'; // 确保字符串以\0字符结束

    return 0;
}

int userAdd(MYSQL *conn,int netfd, cmd_t *pcmd){
    char sql[2048] = {0};
    sprintf(sql, "select  * from user where name = '%s';", pcmd->argv1);
    mysql_query(conn, sql);
    SQL_LOG(conn);
    MYSQL_RES* res;
    res = mysql_store_result(conn);
    if(mysql_num_rows(res) != 0) {
        errorSend(netfd, NULL);
        errorSend(netfd, "用户已存在!");
        return -1;
    }
    mysql_free_result(res);

    char salt[21] = {0};
    char encryptedPassword[256] = {0};
    getSalt(pcmd->argv1, salt);
    strncpy(encryptedPassword, crypt(pcmd->argv2, salt), 255);
    encryptedPassword[255] = '\0';

    memset(sql, 0, sizeof(sql));
    sprintf(sql, "insert into user (name, salt, encrypted_password) "
            "values ('%s', '%s', '%s');",
            pcmd->argv1, salt, encryptedPassword);
    mysql_query(conn,sql);
    SQL_LOG(conn);

    successSend(netfd);

    insertFileTable(conn, pcmd, NULL);
    return 0;
}
